home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / matloc.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  10.4 KB  |  347 lines

  1.       subroutine matloc
  2.       implicit double precision (a-h,o-z)
  3. c
  4. c     this routine stores the locations of the various matrix terms to
  5. c which the different circuit elements contribute.
  6. c
  7. c spice version 2g.6  sccsid=tabinf 3/15/83
  8.       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
  9.      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
  10.      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
  11.      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
  12.      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
  13.      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval,
  14.      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt,
  15.      7   irowno,jcolno,nttbr,nttar,lvntmp
  16. c spice version 2g.6  sccsid=cirdat 3/15/83
  17.       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
  18.      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc
  19. c spice version 2g.6  sccsid=status 3/15/83
  20.       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
  21.      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon,
  22.      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile
  23. c spice version 2g.6  sccsid=ac 3/15/83
  24.       common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq,
  25.      1   inoise,nosprt,nosout,nosin,idist,idprt
  26. c spice version 2g.6  sccsid=blank 3/15/83
  27.       common /blank/ value(200000)
  28.       integer nodplc(64)
  29.       complex cvalue(32)
  30.       equivalence (value(1),nodplc(1),cvalue(1))
  31. c
  32. c  resistors
  33. c
  34.       loc=locate(1)
  35.   690 if ((loc.eq.0).or.(nodplc(loc+8).ne.0)) go to 700
  36.       node1=nodplc(loc+2)
  37.       node2=nodplc(loc+3)
  38.       nodplc(loc+4)=indxx(node1,node2)
  39.       nodplc(loc+5)=indxx(node2,node1)
  40.       nodplc(loc+6)=indxx(node1,node1)
  41.       nodplc(loc+7)=indxx(node2,node2)
  42.       loc=nodplc(loc)
  43.       go to 690
  44. c
  45. c  capacitors
  46. c
  47.   700 loc=locate(2)
  48.   710 if ((loc.eq.0).or.(nodplc(loc+12).ne.0)) go to 720
  49.       node1=nodplc(loc+2)
  50.       node2=nodplc(loc+3)
  51.       nodplc(loc+5)=indxx(node1,node2)
  52.       nodplc(loc+6)=indxx(node2,node1)
  53.       nodplc(loc+10)=indxx(node1,node1)
  54.       nodplc(loc+11)=indxx(node2,node2)
  55.       loc=nodplc(loc)
  56.       go to 710
  57. c
  58. c  inductors
  59. c
  60.   720 loc=locate(3)
  61.   730 if ((loc.eq.0).or.(nodplc(loc+14).ne.0)) go to 740
  62.       node1=nodplc(loc+2)
  63.       node2=nodplc(loc+3)
  64.       ibr=nodplc(loc+5)
  65.       nodplc(loc+6)=indxx(node1,ibr)
  66.       nodplc(loc+7)=indxx(node2,ibr)
  67.       nodplc(loc+8)=indxx(ibr,node1)
  68.       nodplc(loc+9)=indxx(ibr,node2)
  69.       nodplc(loc+13)=indxx(ibr,ibr)
  70.       loc=nodplc(loc)
  71.       go to 730
  72. c
  73. c  mutual inductances
  74. c
  75.   740 loc=locate(4)
  76.   750 if ((loc.eq.0).or.(nodplc(loc+6).ne.0)) go to 760
  77.       nl1=nodplc(loc+2)
  78.       nl2=nodplc(loc+3)
  79.       ibr1=nodplc(nl1+5)
  80.       ibr2=nodplc(nl2+5)
  81.       nodplc(loc+4)=indxx(ibr1,ibr2)
  82.       nodplc(loc+5)=indxx(ibr2,ibr1)
  83.       loc=nodplc(loc)
  84.       go to 750
  85. c
  86. c  nonlinear voltage controlled current sources
  87. c
  88.   760 loc=locate(5)
  89.   762 if ((loc.eq.0).or.(nodplc(loc+13).ne.0)) go to 764
  90.       node1=nodplc(loc+2)
  91.       node2=nodplc(loc+3)
  92.       ndim=nodplc(loc+4)
  93.       lnod=nodplc(loc+6)
  94.       lmat=nodplc(loc+7)
  95.       do 763 i=1,ndim
  96.       node3=nodplc(lnod+1)
  97.       node4=nodplc(lnod+2)
  98.       lnod=lnod+2
  99.       nodplc(lmat+1)=indxx(node1,node3)
  100.       nodplc(lmat+2)=indxx(node1,node4)
  101.       nodplc(lmat+3)=indxx(node2,node3)
  102.       nodplc(lmat+4)=indxx(node2,node4)
  103.       lmat=lmat+4
  104.   763 continue
  105.       loc=nodplc(loc)
  106.       go to 762
  107. c
  108. c  nonlinear voltage controlled voltage sources
  109. c
  110.   764 loc=locate(6)
  111.   766 if ((loc.eq.0).or.(nodplc(loc+14).ne.0)) go to 768
  112.       node1=nodplc(loc+2)
  113.       node2=nodplc(loc+3)
  114.       ndim=nodplc(loc+4)
  115.       ibr=nodplc(loc+6)
  116.       lnod=nodplc(loc+7)
  117.       lmat=nodplc(loc+8)
  118.       nodplc(lmat+1)=indxx(node1,ibr)
  119.       nodplc(lmat+2)=indxx(node2,ibr)
  120.       nodplc(lmat+3)=indxx(ibr,node1)
  121.       nodplc(lmat+4)=indxx(ibr,node2)
  122.       lmat=lmat+4
  123.       do 767 i=1,ndim
  124.       node3=nodplc(lnod+1)
  125.       node4=nodplc(lnod+2)
  126.       lnod=lnod+2
  127.       nodplc(lmat+1)=indxx(ibr,node3)
  128.       nodplc(lmat+2)=indxx(ibr,node4)
  129.       lmat=lmat+2
  130.   767 continue
  131.       loc=nodplc(loc)
  132.       go to 766
  133. c
  134. c  nonlinear current controlled current sources
  135. c
  136.   768 loc=locate(7)
  137.   770 if ((loc.eq.0).or.(nodplc(loc+13).ne.0)) go to 772
  138.       node1=nodplc(loc+2)
  139.       node2=nodplc(loc+3)
  140.       ndim=nodplc(loc+4)
  141.       locvs=nodplc(loc+6)
  142.       lmat=nodplc(loc+7)
  143.       do 771 i=1,ndim
  144.       locvst=nodplc(locvs+i)
  145.       ibr=nodplc(locvst+6)
  146.       nodplc(lmat+1)=indxx(node1,ibr)
  147.       nodplc(lmat+2)=indxx(node2,ibr)
  148.       lmat=lmat+2
  149.   771 continue
  150.       loc=nodplc(loc)
  151.       go to 770
  152. c
  153. c  nonlinear current controlled voltage sources
  154. c
  155.   772 loc=locate(8)
  156.   774 if ((loc.eq.0).or.(nodplc(loc+14).ne.0)) go to 780
  157.       node1=nodplc(loc+2)
  158.       node2=nodplc(loc+3)
  159.       ndim=nodplc(loc+4)
  160.       ibr=nodplc(loc+6)
  161.       locvs=nodplc(loc+7)
  162.       lmat=nodplc(loc+8)
  163.       nodplc(lmat+1)=indxx(node1,ibr)
  164.       nodplc(lmat+2)=indxx(node2,ibr)
  165.       nodplc(lmat+3)=indxx(ibr,node1)
  166.       nodplc(lmat+4)=indxx(ibr,node2)
  167.       lmat=lmat+4
  168.       do 775 i=1,ndim
  169.       locvst=nodplc(locvs+i)
  170.       kbr=nodplc(locvst+6)
  171.       nodplc(lmat+i)=indxx(ibr,kbr)
  172.   775 continue
  173.       loc=nodplc(loc)
  174.       go to 774
  175. c
  176. c  voltage sources
  177. c
  178.   780 loc=locate(9)
  179.   790 if ((loc.eq.0).or.(nodplc(loc+11).ne.0)) go to 800
  180.       node1=nodplc(loc+2)
  181.       node2=nodplc(loc+3)
  182.       iptr=nodplc(loc+6)
  183.       nodplc(loc+7)=indxx(node1,iptr)
  184.       nodplc(loc+8)=indxx(node2,iptr)
  185.       nodplc(loc+9)=indxx(iptr,node1)
  186.       nodplc(loc+10)=indxx(iptr,node2)
  187.       loc=nodplc(loc)
  188.       go to 790
  189. c
  190. c  diodes
  191. c
  192.   800 loc=locate(11)
  193.   810 if ((loc.eq.0).or.(nodplc(loc+16).ne.0)) go to 820
  194.       node1=nodplc(loc+2)
  195.       node2=nodplc(loc+3)
  196.       node3=nodplc(loc+4)
  197.       nodplc(loc+7)=indxx(node1,node3)
  198.       nodplc(loc+8)=indxx(node2,node3)
  199.       nodplc(loc+9)=indxx(node3,node1)
  200.       nodplc(loc+10)=indxx(node3,node2)
  201.       nodplc(loc+13)=indxx(node1,node1)
  202.       nodplc(loc+14)=indxx(node2,node2)
  203.       nodplc(loc+15)=indxx(node3,node3)
  204.       loc=nodplc(loc)
  205.       go to 810
  206. c
  207. c  transistors
  208. c
  209.   820 loc=locate(12)
  210.   830 if ((loc.eq.0).or.(nodplc(loc+36).ne.0)) go to 840
  211.       node1=nodplc(loc+2)
  212.       node2=nodplc(loc+3)
  213.       node3=nodplc(loc+4)
  214.       node4=nodplc(loc+5)
  215.       node5=nodplc(loc+6)
  216.       node6=nodplc(loc+7)
  217.       node7=nodplc(loc+30)
  218.       nodplc(loc+10)=indxx(node1,node4)
  219.       nodplc(loc+11)=indxx(node2,node5)
  220.       nodplc(loc+12)=indxx(node3,node6)
  221.       nodplc(loc+13)=indxx(node4,node1)
  222.       nodplc(loc+14)=indxx(node4,node5)
  223.       nodplc(loc+15)=indxx(node4,node6)
  224.       nodplc(loc+16)=indxx(node5,node2)
  225.       nodplc(loc+17)=indxx(node5,node4)
  226.       nodplc(loc+18)=indxx(node5,node6)
  227.       nodplc(loc+19)=indxx(node6,node3)
  228.       nodplc(loc+20)=indxx(node6,node4)
  229.       nodplc(loc+21)=indxx(node6,node5)
  230.       nodplc(loc+24)=indxx(node1,node1)
  231.       nodplc(loc+25)=indxx(node2,node2)
  232.       nodplc(loc+26)=indxx(node3,node3)
  233.       nodplc(loc+27)=indxx(node4,node4)
  234.       nodplc(loc+28)=indxx(node5,node5)
  235.       nodplc(loc+29)=indxx(node6,node6)
  236.       nodplc(loc+31)=indxx(node7,node7)
  237.       nodplc(loc+32)=indxx(node4,node7)
  238.       nodplc(loc+33)=indxx(node7,node4)
  239.       nodplc(loc+34)=indxx(node2,node4)
  240.       nodplc(loc+35)=indxx(node4,node2)
  241.       loc=nodplc(loc)
  242.       go to 830
  243. c
  244. c  jfets
  245. c
  246.   840 loc=locate(13)
  247.   850 if ((loc.eq.0).or.(nodplc(loc+25).ne.0)) go to 860
  248.       node1=nodplc(loc+2)
  249.       node2=nodplc(loc+3)
  250.       node3=nodplc(loc+4)
  251.       node4=nodplc(loc+5)
  252.       node5=nodplc(loc+6)
  253.       nodplc(loc+9)=indxx(node1,node4)
  254.       nodplc(loc+10)=indxx(node2,node4)
  255.       nodplc(loc+11)=indxx(node2,node5)
  256.       nodplc(loc+12)=indxx(node3,node5)
  257.       nodplc(loc+13)=indxx(node4,node1)
  258.       nodplc(loc+14)=indxx(node4,node2)
  259.       nodplc(loc+15)=indxx(node4,node5)
  260.       nodplc(loc+16)=indxx(node5,node2)
  261.       nodplc(loc+17)=indxx(node5,node3)
  262.       nodplc(loc+18)=indxx(node5,node4)
  263.       nodplc(loc+20)=indxx(node1,node1)
  264.       nodplc(loc+21)=indxx(node2,node2)
  265.       nodplc(loc+22)=indxx(node3,node3)
  266.       nodplc(loc+23)=indxx(node4,node4)
  267.       nodplc(loc+24)=indxx(node5,node5)
  268.       loc=nodplc(loc)
  269.       go to 850
  270. c
  271. c  mosfets
  272. c
  273.   860 loc=locate(14)
  274.   870 if ((loc.eq.0).or.(nodplc(loc+33).ne.0)) go to 900
  275.       node1=nodplc(loc+2)
  276.       node2=nodplc(loc+3)
  277.       node3=nodplc(loc+4)
  278.       node4=nodplc(loc+5)
  279.       node5=nodplc(loc+6)
  280.       node6=nodplc(loc+7)
  281.       nodplc(loc+10)=indxx(node1,node5)
  282.       nodplc(loc+11)=indxx(node2,node4)
  283.       nodplc(loc+12)=indxx(node2,node5)
  284.       nodplc(loc+13)=indxx(node2,node6)
  285.       nodplc(loc+14)=indxx(node3,node6)
  286.       nodplc(loc+15)=indxx(node4,node2)
  287.       nodplc(loc+16)=indxx(node4,node5)
  288.       nodplc(loc+17)=indxx(node4,node6)
  289.       nodplc(loc+18)=indxx(node5,node1)
  290.       nodplc(loc+19)=indxx(node5,node2)
  291.       nodplc(loc+20)=indxx(node5,node4)
  292.       nodplc(loc+21)=indxx(node5,node6)
  293.       nodplc(loc+22)=indxx(node6,node2)
  294.       nodplc(loc+23)=indxx(node6,node3)
  295.       nodplc(loc+24)=indxx(node6,node4)
  296.       nodplc(loc+25)=indxx(node6,node5)
  297.       nodplc(loc+27)=indxx(node1,node1)
  298.       nodplc(loc+28)=indxx(node2,node2)
  299.       nodplc(loc+29)=indxx(node3,node3)
  300.       nodplc(loc+30)=indxx(node4,node4)
  301.       nodplc(loc+31)=indxx(node5,node5)
  302.       nodplc(loc+32)=indxx(node6,node6)
  303.       loc=nodplc(loc)
  304.       go to 870
  305. c
  306. c  transmission lines
  307. c
  308.   900 loc=locate(17)
  309.   910 if ((loc.eq.0).or.(nodplc(loc+33).ne.0)) go to 1000
  310.       node1=nodplc(loc+2)
  311.       node2=nodplc(loc+3)
  312.       node3=nodplc(loc+4)
  313.       node4=nodplc(loc+5)
  314.       ni1=nodplc(loc+6)
  315.       ni2=nodplc(loc+7)
  316.       ibr1=nodplc(loc+8)
  317.       ibr2=nodplc(loc+9)
  318.       nodplc(loc+10)=indxx(node1,node1)
  319.       nodplc(loc+11)=indxx(node1,ni1)
  320.       nodplc(loc+12)=indxx(node2,ibr1)
  321.       nodplc(loc+13)=indxx(node3,node3)
  322.       nodplc(loc+14)=indxx(node4,ibr2)
  323.       nodplc(loc+15)=indxx(ni1,node1)
  324.       nodplc(loc+16)=indxx(ni1,ni1)
  325.       nodplc(loc+17)=indxx(ni1,ibr1)
  326.       nodplc(loc+18)=indxx(ni2,ni2)
  327.       nodplc(loc+19)=indxx(ni2,ibr2)
  328.       nodplc(loc+20)=indxx(ibr1,node2)
  329.       nodplc(loc+21)=indxx(ibr1,node3)
  330.       nodplc(loc+22)=indxx(ibr1,node4)
  331.       nodplc(loc+23)=indxx(ibr1,ni1)
  332.       nodplc(loc+24)=indxx(ibr1,ibr2)
  333.       nodplc(loc+25)=indxx(ibr2,node1)
  334.       nodplc(loc+26)=indxx(ibr2,node2)
  335.       nodplc(loc+27)=indxx(ibr2,node4)
  336.       nodplc(loc+28)=indxx(ibr2,ni2)
  337.       nodplc(loc+29)=indxx(ibr2,ibr1)
  338.       nodplc(loc+31)=indxx(node3,ni2)
  339.       nodplc(loc+32)=indxx(ni2,node3)
  340.       loc=nodplc(loc)
  341.       go to 910
  342. c
  343. c  finished
  344. c
  345.  1000 return
  346.       end
  347.